home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / changefi.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-08  |  1.5 KB  |  59 lines

  1. /*
  2.                             C H A N G E F I . C
  3. */
  4.  
  5. #include "iccomp.h"
  6.  
  7. #define     N_FILES 11
  8.  
  9. static struct
  10. {
  11.     int
  12.         former_linenr;
  13.     char
  14.         *fname;
  15. }
  16.     stack[N_FILES];
  17.  
  18. static int
  19.     filenames_len,
  20.     sp = N_FILES;
  21.  
  22. void change_file(s)
  23.     char
  24.         *s;                                 /* name of source file to open */
  25. {
  26.     register int
  27.         slen;
  28.  
  29.     if (*s)                                 /* any filename ? */
  30.     {
  31.         if (!sp--)                          /* no more entries ? */
  32.             error("Over 10 included files");
  33.  
  34.         stack[sp].fname = xstrdup(s);       /* save the name of the file */
  35.         stack[sp].former_linenr = yylineno; /* save the line number */
  36.  
  37.         filenames = xrealloc(filenames,     /* room for new filename */
  38.                         filenames_len +
  39.                         (slen = strlen(s)) +
  40.                         2);
  41.                                             /* append name */
  42.         sprintf(filenames + filenames_len, "%s\n", s);
  43.         filenames_len += slen + 1;          /* new length of string */
  44.  
  45.         yylineno = 0;                       /* start at new file */
  46.     }
  47.     else
  48.     {
  49.         if (sp == N_FILES - 1)
  50.             error("[%s] Line %d: Include file stack empty", source_name,
  51.                                                         yylineno);
  52.         free(stack[sp].fname);
  53.         yylineno = stack[sp].former_linenr - 1;
  54.         sp++;                               /* free stack element */
  55.     }
  56.  
  57.     source_name = stack[sp].fname;
  58. }
  59.